/* 操纵杆类 */
public class LeverSense {
	private LeverPosition leverPosition; //操纵杆的位置
	private PowerStatus powerStatus;  //电源状态
	
	//构造函数
	public LeverSense()
	{
		leverPosition = LeverPosition.STOP; //操纵杆处于“停止”
		powerStatus = PowerStatus.OFF;  //电源是关闭状态
	}
	
	//构造带参数的操纵杆类
	public LeverSense(PowerStatus statPower,LeverPosition posLevel)
	{
		powerStatus = statPower;  //电源状态
		leverPosition = posLevel; //操纵杆位置
	}
	
	/*********************************
	 * 操纵杆抬起,只有带电才起作用。
	 * 默认情况下，断言检查是禁用的，要在Eclipse中启用Java程序的断言，需要修改运行配置来包含启用断言的JVM参数。
	 * 以下是步骤：
			点击“运行”菜单，选择“运行配置”。
			在出现的对话框中，找到“参数”标签。
			在“VM参数”的文本框中，加入 -ea 或者 -enableassertions。这会启用断言检查。
			点击“应用”，然后点击“运行”。
		System.out.println("Dummy code for breakpoint");
		System.out.println(leverPosition);
		assert(LeverPosition.LOW == leverPosition);
	 ********************************************/
	public void Up()
	{
		if( PowerStatus.ON == powerStatus )
		{
			switch( leverPosition )
			{
			case STOP:
				leverPosition = LeverPosition.INTERM;	
				break;
			case INTERM:  //操纵杆从间歇状态到低速状态。
				leverPosition = LeverPosition.LOW;	
				break;
			default:  //无论初始位置为低速或高速，Up后，都为高速。
				leverPosition = LeverPosition.HIGH;	
				break;
			}
		}
		// else {} //电源关闭，操纵杆位置不变。
	}
	
	/*教学演示的Up*/
	public void UpForTeachingDemonstration()
	{
		if( PowerStatus.OFF == powerStatus )
			return;
		switch( leverPosition )
		{
		case STOP:
			leverPosition = LeverPosition.INTERM;	
			break;
		case INTERM:  //操纵杆从间歇状态到低速状态。
			leverPosition = LeverPosition.LOW;	
			break;
		default:     //无论初始位置为低速或高速，Up后，都为高速。
			leverPosition = LeverPosition.HIGH;	
			break;
		}
	}
	
	
	//操纵杆放下,只有带电才起作用。
	public void Down()
	{
		if( PowerStatus.OFF == powerStatus )
			return;
		switch( leverPosition )
		{
		case HIGH:
			leverPosition = LeverPosition.LOW;	
			break;
		case LOW:
			leverPosition = LeverPosition.INTERM;	
			break;
		case INTERM: //操纵杆从间歇状态到停止状态。
			leverPosition = LeverPosition.STOP;
			break;
		default:  //STOP
			leverPosition = LeverPosition.STOP;	
			break;
		}
	}
	
	//获得操纵杆的位置
	public LeverPosition GetLeverPosition()
	{
		return leverPosition;
	}
	
	//设定操纵杆的位置。
	public void SetLeverPosition(LeverPosition posLevel)
	{
		leverPosition = posLevel;
	}
	
	//改变电源状态
	public void SetPowerStatus( PowerStatus statPower )
	{
		powerStatus = statPower;
	}
	
	//测试我自己的Up()
	//返回值为0，说明所有测试用例执行结果符合预期；否则，在第（返回值）个测试用例，与预期不符。
	public int TestMyUp()
	{
		//第一个测试用例，断电后不能改变状态。
		SetPowerStatus(PowerStatus.OFF);
		SetLeverPosition(LeverPosition.LOW);
		Up();  //被测实体。
		if( LeverPosition.LOW!=GetLeverPosition() ) //起始状态为LOW，抬起操纵杆后状态仍为LOW。
			return 1;
		//第二个测试用例，加电和抬起操纵杆后状态从STOP->INTERM。
		SetPowerStatus(PowerStatus.ON);  
		SetLeverPosition(LeverPosition.STOP);
		Up();
		if( LeverPosition.INTERM!=GetLeverPosition() )
			return 2;
		//第三个测试用例，加电和抬起操纵杆后状态从INTERM->LOW。
		SetPowerStatus(PowerStatus.ON);
		SetLeverPosition(LeverPosition.INTERM);
		Up();
		if( LeverPosition.LOW!=GetLeverPosition() )
			return 3;
		//第四个测试用例，加电和抬起操纵杆后状态从LOW->HIGH。
		SetPowerStatus(PowerStatus.ON);  //重复设置电源状态，隔离故障源。
		SetLeverPosition(LeverPosition.LOW);
		Up();
		if( LeverPosition.HIGH!=GetLeverPosition() )
			return 4;
		return 0;
	}
}
